package com.liuya.base;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import com.liuya.common.Constants;
import com.liuya.common.WebUtil;
import com.liuya.common.support.Assert;
import com.liuya.common.InstanceUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * 基础服务类
 *
 * @author liuya
 * @date 20160824
 */
public class AbstractBaseService<T extends BaseModel> extends BaseMethods<T> implements BaseService<T> {
    protected Logger logger = LogManager.getLogger();
    @Autowired
    private RedisTemplate redisTemplate;
    //提供者，对于想要拆分为微服务的功能只需要使用它，需要重写set get方法或使用Autowired在自己的Service中指定，推荐第二种方式.
    protected BaseProvider<T> provider;

    /**
     * 修改
     */
    @Override
    public T update(T record) {
        Assert.isNotBlank(record.getId().toString(), "ID");
        record.setUpdateBy(WebUtil.getCurrentUserId());
        return super.update(record);
    }

    /**
     * 新增
     */
    @Override
    @Transactional
//    @CacheEvict
    public void add(T record) {
        String uid = WebUtil.getCurrentUserId();
        if (StringUtils.isBlank(record.getCreateBy())) {
            record.setCreateBy(uid == null ? "" : uid);
        }
        if (StringUtils.isBlank(record.getUpdateBy())) {
            record.setUpdateBy(uid == null ? "" : uid);
        } else if (StringUtils.isNotBlank(uid)) {
            record.setUpdateBy(uid);
        }
        super.update(record);
    }

//    /**
//     * 根据Id查询
//     */
//    @Transactional
//    @Override
//    public T selectById(String id) {
//        Assert.isBlank(id, "ID");
//        StringBuilder ckey = new StringBuilder(Constants.CACHE_NAMESPACE);
//        String beanName = this.getClass().getSimpleName().replace("Service", "");
//        ckey.append(beanName.substring(0, 1).toLowerCase()).append(beanName.substring(1));
//        ckey.append(":").append(id);
//        T record = (T) redisTemplate.opsForValue().get(ckey.toString());
//        if (record == null) {
//            record = selectById(id);
//        }
//        return record;
//    }

//    /**
//     * 条件查询
//     */
//    public PageInfo<T> select(Map<String, Object> params) {
//        startPage(params);
//        return selectPageByIds(mapper.query(params));
//    }

//    /**
//     * 根据Id查询(默认类型T)
//     */
//    public PageInfo<T> selectPageByIds(Page<String> ids) {
//        if (ids != null) {
//            Page<T> page = new Page<T>(ids.getPageNum(), ids.getPageSize());
//            page.setTotal(ids.getTotal());
//            page.clear();
//            for (String id : ids) {
//                page.add(selectById(id));
//            }
//            return new PageInfo<T>(page);
//        }
//        return new PageInfo<T>();
//    }

//    /**
//     * 根据Id查询(cls返回类型Class)
//     */
//    public <K> PageInfo<K> selectPageByIds(Page<String> ids, Class<K> cls) {
//        if (ids != null) {
//            Page<K> page = new Page<K>(ids.getPageNum(), ids.getPageSize());
//            page.setTotal(ids.getTotal());
//            page.clear();
//            for (String id : ids) {
//                BaseModel t = selectById(id);
//                K k = InstanceUtil.to(t, cls);
//                page.add(k);
//            }
//            return new PageInfo<K>(page);
//        }
//        return new PageInfo<K>();
//    }

    /**
     * 根据Id查询(默认类型T)
     */
    public List selectListByIds(List<String> ids) {
        List list = InstanceUtil.newArrayList();
        if (ids != null) {
            for (String id : ids) {
                list.add(selectById(id));
            }
        }
        return list;
    }

//    /**
//     * 根据Id查询(cls返回类型Class)
//     */
//    public <K> List<K> selectByIds(List<String> ids, Class<K> cls) {
//        List<K> list = InstanceUtil.newArrayList();
//        if (ids != null) {
//            for (String id : ids) {
//                BaseModel t = selectById(id);
//                K k = InstanceUtil.to(t, cls);
//                list.add(k);
//            }
//        }
//        return list;
//    }


}
